package vue;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import javax.swing.JDialog;
import javax.swing.JPanel;

/**
 * Panneau de défilement du générique pour la fenêtre à propos 
 */
public class Defile extends JPanel implements WindowListener,Runnable
 {
	private static final long serialVersionUID = 1L;
	/**Thread permettant l'affichage du panneau*/
	private Thread runner = null; 
	/**Nombre maximum de ligne 500**/
	private String str[][] = new String[10][500]; 
	/**Nombre de ligne par paragraphe*/
	private int nblig[] = new int[500];
	/**nombre de paragraphes**/
	private int nbpara = 0;
	/**numéro du paragraphe en cours*/
	private int ipara = 0;
	/**position du texte par rapport au bord gauche*/
	private int i = 5;
	/**position du texte en hauteur*/
	private int j; 
	/** position de la dernière ligne*/
	private int fin; 
	/**dimensions du panneau**/
	private int largeur, hauteur;
	/**Couleur du Texte Normal**/
	private Color CT = Color.BLACK; // couleur du texte normal
	/**Couleur de fond du panneau*/
	private Color CF = Color.WHITE; 
	/**Fichier à lire**/
	private String FIC = "vue/defile.txt";
	/**Valeur du nom de la fonte**/
	private String TT = "Arial";
	/**valeur de la taille de la fonte texte normal*/
	private int TH = 14; 
	/**valeur de la taille de la font du lien*/
	private int THL = 16;
	/**valeur du style de la police normal*/
	private int TS = 0;
	/**valeur du style de la police normal*/
	private int TSL = 1;
	
	private Font F1 = new Font(TT,TSL,THL); // fonte1
	private Font F2 = new Font(TT,TS,TH); // fonte2
	private Font F3 = new Font(TT,Font.BOLD,TH);//fonte3
	private Font F4 = new Font(TT,Font.ITALIC,12);//fonte4

	/**
	 * Construit un panneau de défilement de texte
	 */
	public Defile () 
	{
		largeur = this.getWidth(); 
		hauteur = this.getHeight();
		
		setBackground(CF); //mise en place de la couleur du fond
		j = hauteur;
		fin = j;

		try 
		{	
			InputStream FluxTexte = new FileInputStream(new File(FIC));
	
			BufferedReader FluxDTexte=new BufferedReader(new InputStreamReader(FluxTexte));
			String ligne=FluxDTexte.readLine();
			nbpara = 0;
			nblig[nbpara] = 0;
				
			while (ligne!=null)
			{
				str[nbpara][nblig[nbpara]] = ligne; //on remplit le texte
				ligne = FluxDTexte.readLine(); //Lecture de la ligne suivante
				nblig[nbpara] = nblig[nbpara]+1;
			}
		}
		catch (MalformedURLException e){}
		catch (IOException e){}
	}
	
	/**
	 * S'exécute quand le panneau doit être repeint
	 * @param screen  
	 */
	public void paintComponent(Graphics screen) 
	{
		super.paintComponent(screen);
		int k=0;
	
		largeur = this.getWidth(); 
		hauteur = this.getHeight();
		
		if (screen != null)
		{	
			screen.setColor(CF);	
			screen.fillRect(0,0,largeur,hauteur);
			
			for (k=0;k<nblig[ipara];k++) 
			{
	      		screen.setColor(CT);
	
		      	if (str[ipara][k].substring(0,3).equals("[B]"))	      	screen.setFont(F3); 			
		      	else if (str[ipara][k].substring(0,3).equals("[T]"))	screen.setFont(F1);
		     	else if (str[ipara][k].substring(0,3).equals("[N]"))	screen.setFont(F2);
		     	else if (str[ipara][k].substring(0,3).equals("[M]"))	screen.setFont(F4);
		     		
		     	int x = (int)(this.getWidth()-screen.getFontMetrics().getStringBounds(str[ipara][k].substring(3),screen).getWidth())/2;
		     		
		     	screen.drawString(str[ipara][k].substring(3),x,j+20*k);
			}		
		  	fin=j+20*k;
		}
	}
	
	/**
	 * Démarrage du Thread
	 */
	public void start() 
	{
	    runner = new Thread (this);
	    runner.start ();
	}

	/**
	 * S'exécute durant la vie du Thread
	 */
	public void run () 
	{
        while (true)
        {
			if (fin>0) j = j-2;
			else 
			{
				j = hauteur;
				if (ipara<nbpara-1)	ipara = ipara+1;
				else ipara=0;
			}
				
			//Repaint le panneau
			repaint();
			//Vitesse de défilement du Thread
			try 
			{
				Thread.sleep(30);
			} 
			catch(InterruptedException e){}		      
		}
	}	
	
	/**
	 * Arrête le Thread
	 */
	public void stop() 
	{
	      if (runner != null) runner.interrupt();
	}
	
	/**
	 * Quand la fenêtre a propos a été ouverte...
	 * Redémarre le Thread 
	 */
	public void windowOpened(WindowEvent e) 
	{
		j=this.getHeight();
		this.start();
	}

	/**
	 * Quand la fenêtre a propos est en train de se fermer...
	 * Arrete le Thread
	 */
	public void windowClosing(WindowEvent e) 
	{
		this.stop();
		((JDialog)e.getSource()).dispose();
	}

	public void windowClosed(WindowEvent e){}
	public void windowIconified(WindowEvent e){}
	public void windowDeiconified(WindowEvent e){}
	public void windowActivated(WindowEvent e){}
	public void windowDeactivated(WindowEvent e){}
}